package cn.zn.modules.appoin.service;

import cn.zn.framework.common.utils.PageUtils;
import cn.zn.framework.common.utils.R;
import cn.zn.modules.appoin.entity.AppoinTimeDetail;
import cn.zn.modules.appoin.entity.dto.AppointTimeDetailDTO;
import cn.zn.modules.appoin.entity.dto.AppointUserForDetailDTO;
import cn.zn.modules.appoin.entity.vo.AppoinWorkVO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Date;
import java.util.Map;

public interface AppoinTimeDetailService extends IService<AppoinTimeDetail> {

    /**
     * 得到待生成工作规则
     *
     * @param mainId
     */
    AppoinWorkVO queryAppoinWork(String mainId);

    /**
     * 保存工作时间
     *
     * @param mainId
     */
    void saveGenerateTimes(String mainId);

    /**
     * 保存工作时间明细
     *
     * @param mainId
     */
    void saveGenerateDetails(String mainId);

    /**
     * 工作时间明细（按主表）
     *
     * @param mainId
     * @return
     */
    PageUtils queryByMainId(String mainId, Map<String, Object> params);

    /**
     * 工作时间明细（按主表）
     *
     * @param mainId
     * @return
     */
    PageUtils queryByMainIdForWapp(String mainId, Map<String, Object> params);

    /**
     * 工作时间明细（按日期）
     *
     * @param tenantId
     * @param date
     * @param params
     * @param isShowNoUser 是否显示没有预约的明细
     * @param hiddenUser   是否隐藏用户名称
     * @return
     */
    PageUtils queryByDate(Long tenantId, String date, Map<String, Object> params, Boolean isShowNoUser, boolean hiddenUser);

    /**
     * 查询用户预约
     *
     * @param userId
     * @param params
     * @return
     */
    PageUtils queryByUser(Long tenantId, String userId, Map<String, Object> params);

    /**
     * 查询可用数量
     *
     * @param mainId
     * @return
     */
    Integer queryAvailableCountForMain(String mainId);

    /**
     * 保存预约时间（订单）
     *
     * @param dto
     * @param userId 登录用户ID
     */
    void saveDetail(AppointTimeDetailDTO dto, Long userId, boolean isVal);

    /**
     * 更新详情的预约人
     *
     * @param dto
     * @param userId
     * @param isNew  是否新预约，false-不验证是否已预约
     */
    Boolean updateAppointUserForDetail(AppointUserForDetailDTO dto, Long userId, boolean isNew);

    /**
     * 统计每月预约数量
     *
     * @param userCode 用户编号
     * @param tenantId 租户
     * @param year     年度
     * @return
     */
    R summarySignNum(
            String userCode,
            Long tenantId,
            Integer year);

    /**
     * 选择的时间是否已经存在
     *
     * @param mainId
     * @param selTime
     * @param duration 选择的工作时长，0-未设置工作时长
     * @return
     */
    Boolean isExist(String mainId, Date selTime, Integer duration);

    /**
     * 查询最近的预约信息
     *
     * @param mainId
     * @param selTime
     * @return
     */
    AppoinTimeDetail queryNearestByMainAndTime(String mainId, Date selTime);

}
